# 作业1：
#     写接口，登录接口和支付接口
#         1、登录接口
#         user
#         id username password
#             /api/login
#                入参
#                 username
#                 password
#                 登录成功，产生一个sessionid，规则md5(username+时间戳)
#                 session存到redis里面，失效时间 2小时
#                 key value  2*60*60
#
#                  #1、选做，如果token已经存在，那么直接返回原token，更新token的过期时间
#
#                 {"code":0,"msg":"登录成功","token":"ea416ed0759d46a8de58f63a59077499"}
#         2、支付接口
#         account
#         id
#         user_id
#         balance
#         / api / pay?token = xxxx & money = sss
#         1、校验token是否失效
#         2、金额格式也要校验，可以是int和float
#         3、余额不足要提示
#         4、余额充足的情况下要扣钱
#
# {"code": 0, "msg": "支付成功"}
# 思路：
# 1、提供接口（两个入参，username，password）
# 2、从数据查询登录密码和账号，判断是否登录成功（可以用函数写）
# 3、登录成功后生成一个sessionidmd5(username+时间戳)
# 4、把sessionid存入redise，失效时间2小时

import flask
import json
import hashlib
import MySQL
import redis
import time
import traceback
r=redis.Redis(
    host="118.24.3.40",
    password="HK139bc&*",
    port=6379,
    db=0,
    decode_responses=True#代表默认redis返回自动转字符串类型
)

server=flask.Flask(__name__)
#wxy123  Wxytsh123456
#登录接口
@server.route("/api/login",methods=['post'])
def login():
    username = flask.request.json.get("username")  #设置两个入参
    password = flask.request.json.get("password")
    password_md5=hashlib.md5(password.encode()).hexdigest()  #密码转换成md5
    sql = 'select * from user_wxy where name="%s"' % username
    result = MySQL.execute_sql(sql)
    if result:   #判断用户名是否存在
        result_dict = result[0]
        if password_md5==result_dict["password_md5"]:  #判断密码是否正确
            session=("username"+str(time.time()))
            session_id=hashlib.md5(session.encode()).hexdigest()
            r.hset("wxy",session_id,'{"id":1,"username":"%s"}' % username)  #把生成的sessionid写入redis
            r.expire("wxy", 7200)  # 对key设置过期时间
            data = {"code": 0, "msg": "成功", "token":session_id}
            return json.dumps(data,ensure_ascii=False)
        else:
            return json.dumps({"code": 0, "msg": "密码错误"},ensure_ascii=False)
    else:
        return json.dumps({"code": 0, "msg": "账号不存在"},ensure_ascii=False)
        # 登录接口调用地址：http://127.0.0.1:8899/api/login
        # json入参：
        # {
        #     "username":"WXYt123",
        #     "password":"WXYT1wxy123"
        # }





#支付接口
@server.route("/api/pay",methods=['post','get'])
def pay():
    money = flask.request.values.get("money")
    token = flask.request.values.get("token")
    token_user=r.hget("wxy",token)
    if token_user:#判断token是否还有效
        try:
            if isinstance(int(money),int) or isinstance(float(money),float):#判断money字段是否合法
                user_name =eval(token_user)["username"]
                sql_user_id='select id from user_wxy where name="%s";' % user_name
                user_id=MySQL.execute_sql(sql_user_id)[0]["id"]
                check_balance='select balance from user_account_wxy where user_id=%s;' % user_id
                balance=MySQL.execute_sql(check_balance)[0]["balance"]
                if float(money)<=float(balance):#校验余额是否足够支付，如果足够则扣费并更新数据库余额值
                    new_balance=float(balance)-float(money)
                    sql_update_balance='update user_account_wxy set balance =%s where user_id ="%s";'% (new_balance,user_id)
                    MySQL.execute_sql(sql_update_balance)
                    return json.dumps({"code": 0, "msg": "支付成功"},ensure_ascii=False)
                else:#如果余额不足则返回提示
                    return json.dumps({"code": 0, "msg": "余额不足，请充值"},ensure_ascii=False)
            else:
                return json.dumps({"code": 0, "msg": "money类型不正确"},ensure_ascii=False)
        except Exception as e:
                print(e)
                traceback.print_exc()
                return json.dumps({"code": 0, "msg": "入参money类型不正确"},ensure_ascii=False)
    else:#如果token在数据库不存在则已经失效返回提示
        return  json.dumps({"code": 0, "msg": "token失效，请重新登录"},ensure_ascii=False)

#支付接口调用http://127.0.0.1:8899/api/pay?token=c8590c912892e896dfa411b8eff5dc44&money=100


server.run(port=8899,debug=True,host='0.0.0.0')


